package io.github.liuyuhao412.manager.service;

import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Date;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

@Service
public class TokenService {

	// 配置文件里必须有一个至少64字符的密钥
	@Value("${jwt.secret:io!github!liuyuhao412!manager!2025!08!27!SecureKeyForJWTAuthentication!123456}")
	private String secret;

	@Value("${jwt.expire:3600}") // token过期时间，单位秒
	private long expire;

	/**
	 * 获取 HMAC-SHA512 签名 Key，长度必须 >= 64 字节
	 */
	private Key getSigningKey() {
		// UTF-8 编码转换为字节数组
		byte[] keyBytes = secret.getBytes(StandardCharsets.UTF_8);
		return Keys.hmacShaKeyFor(keyBytes);
	}

	/**
	 * 生成 JWT token
	 */
	public String generateToken(Integer userId, String username) {
		Date now = new Date();
		Date expiryDate = new Date(now.getTime() + expire * 1000); // 设置过期时间

		return Jwts.builder().setSubject(userId.toString()) // 用户ID
				.claim("username", username) // 用户名
				.setIssuedAt(now) // 签发时间
				.setExpiration(expiryDate) // 过期时间
				.signWith(getSigningKey(), SignatureAlgorithm.HS512) // 使用 HS512 签名
				.compact();
	}

	/**
	 * 解析 JWT token
	 */
	public Claims parseToken(String token) {
		return Jwts.parserBuilder().setSigningKey(getSigningKey()).build().parseClaimsJws(token).getBody();
	}

	/**
	 * 从 token 中获取用户ID
	 */
	public Integer getUserIdFromToken(String token) {
		Claims claims = parseToken(token);
		return Integer.valueOf(claims.getSubject());
	}

	/**
	 * 从 token 中获取用户名
	 */
	public String getUsernameFromToken(String token) {
		Claims claims = parseToken(token);
		return claims.get("username", String.class);
	}
}
